package server;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * @author huangshuxian
 * @date 2022/3/29 7:07 下午
 * @description
 */
public class MyClassLoader extends ClassLoader {

    private String classDir;// 文件目录

    @Override
    public Class<?> findClass(String name) {
        String realPath = classDir + name.replace(".", "/") + ".class";//class文件的真实路径
        byte[] cLassBytes = null;
        Path path = null;

        try {

            path = Paths.get(new URI(realPath));
            cLassBytes = Files.readAllBytes(path);

        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }
        Class clazz = defineClass(name, cLassBytes, 0, cLassBytes.length);//调用父类的defineClass方法
        return clazz;
    }


    public MyClassLoader(String classDir) {
        this.classDir = "file:".concat(classDir);//拼接 “file:/”前缀
    }

//    @Override
//    protected Class<?> findClass(String basePath, String className) {
//        byte[] classBytes = getClassBytes(basePath, className);
//        return defineClass(className, classBytes, 0, classBytes.length);
//    }
//
//    /**
//     * 读取类的字节码
//     *
//     * @param basePath  根路径
//     * @param className 类的全限定名
//     * @return servlet 的字节码信息
//     * @throws IOException
//     */
//    private byte[] getClassBytes(String basePath, String className) {
//        InputStream in = null;
//        ByteArrayOutputStream out = null;
//        String path = basePath + File.separatorChar + className.replace('.', File.separatorChar) + ".class";
//        try {
//            in = new FileInputStream(path);
//            out = new ByteArrayOutputStream();
//            byte[] buffer = new byte[2048];
//            int len = 0;
//            while ((len = in.read(buffer)) != -1) {
//                out.write(buffer, 0, len);
//            }
//            return out.toByteArray();
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                in.close();
//                out.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//        return null;
//    }

}
